﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PetSoft.GestionRecursos;
using Business_Entity;
using Business_Logic;

namespace PetSoft.GUI.GestRecursos
{
    public partial class GUIDespachoProd : Form
    {
    	BEPedidoAbastecimiento pedido;  
		List<BEProductoTienda> prodTienda;    	
    	int index;
    	int codLinea;
    	
        public GUIDespachoProd(BEPedidoAbastecimiento pedido)
        {
            InitializeComponent();
            this.pedido = pedido;
            this.Load += new EventHandler(GUIDespachoProd_Load);
            this.dispTBL.DoubleClick += new EventHandler(doble_click);
        }
        
        private void doble_click(object sender, EventArgs e){
        	int aux = this.dispTBL.CurrentRow.Index;
        	if((bool)this.dispTBL[0, aux].Value == true){
        		this.dispTBL[0, aux].Value = false;
        	}
        	else{
        		this.dispTBL[0, aux].Value = true;
        	}
        }
        
        private void GUIDespachoProd_Load(object sender, EventArgs e){
        	//carga la tabla de los productos en el pedido
        	try{
        		this.listProdPedTBL.Rows.Clear();
	        	foreach (BELineaPedidoAbastecimiento ped in pedido.Detalle) {
	        		this.listProdPedTBL.Rows.Add(ped.Producto.Codigo, "" + ped.Producto.Nombre, 
	        		                             "" + ped.Proveedor.RazonSocial, ped.Cantidad, ped.CantidadEnviada,0);
	        	}
        		this.lblProdCant.Text = "" + pedido.Detalle.Count;
        	}
        	catch{
        		Utils.MessageError("Hubo un error al intentar cargar la tabla de productos.",null);
        	}
        }
     
        private void acepBTN_Click(object sender, EventArgs e)
        {
            Utils.MessageInformation("La orden de despacho ha sido generado.");
            this.Close();
        }

        private void cancBTN_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        
        void EliCBCOLCheckedChanged(object sender, EventArgs e)
        {
        	for(int i=0; i<this.dispTBL.RowCount; i++){
        		this.dispTBL[0, i].Value = this.eliCBCOL.Checked;
				//list[0, i].Value = ((CheckBox) list.Controls.Find("checkboxHeader", true)[0]).Checked;    		
        	}
        }
        
        void DesCancBTNClick(object sender, EventArgs e)
        {
        	this.Close();
        }
        
        void ProdGuarBTNClick(object sender, EventArgs e)
        {
        	//Guarda la cantidad de productos que fueron enviados a la tienda para cubrir el pedido
        	int cantEnv = 0, cantDisp, cantSel, nuStock, codProd;
        	//El código del producto que se está despachando
        	codProd = Int32.Parse(this.listProdPedTBL.CurrentRow.Cells[0].Value.ToString());
        	//La cantidad actual enviada del producto para el pedido
        	cantEnv = Int32.Parse(this.listProdPedTBL.CurrentRow.Cells[5].Value.ToString());
        	foreach(DataGridViewRow fila in this.dispTBL.Rows){
        		if(fila.Cells[0].Value != null && (bool)fila.Cells[0].Value){
        			//cantDisp = Int32.Parse(fila.Cells[3].Value.ToString());
        			//La cantidad que será enviada desde la tienda
        			BLProductoTienda blProdTienda = new BLProductoTienda();
			        int codTienda = Int32.Parse(fila.Cells[1].Value.ToString());
        			//La cantidad disponible en la tienda elegida
			        cantDisp = blProdTienda.getStockActual(codTienda, codProd);
        			cantSel = Int32.Parse(fila.Cells[4].Value.ToString());
        			if(cantSel<=cantDisp){        
						//Si se envía una cantidad menor o igual a la disponible        				
        				cantEnv = cantEnv + cantSel;
        				nuStock = cantDisp - cantSel;
        				//MessageBox.Show("Envie una cantidad menor o igual a la disponibleasdsdad.");
			        	//actualiza el stock de la tienda que envia
			        	int res = blProdTienda.actualizaStock(codProd, codTienda, nuStock);
			        	fila.Cells[3].Value = blProdTienda.getStockActual(codTienda, codProd);
			        	if(res==0){
			        		Utils.MessageError("Se presento un error al actualizar el stock.",null);
			        		break;
			        	}
			        	else{
			        		BLMovimiento mov = new BLMovimiento();
			        		//Se registra la salida del producto de la tienda elegida
			        		int resMov = mov.nuevaSalidaProducto(codTienda, codProd, cantEnv);
			        		//int resMov = mov.nuevaSalidaProducto(3, 6, 1);
			        		if(resMov==0){
			        			Utils.MessageError("Se presento un error y no se pudo registrar el movimiento de salida.",null);
			        		}			        		
			        	}
			        	fila.Cells[0].Value = false;
        			}
        			else{
        				Utils.MessageAviso("Envie una cantidad menor o igual a la disponible.",null);
        				fila.Cells[0].Selected = false;
        				fila.Cells[1].Selected = false;
        				fila.Cells[2].Selected = false;
        				fila.Cells[3].Selected = true;
        				break;
        			}
        		}      		
        	} 
        	this.listProdPedTBL[5,this.index].Value = cantEnv;
        	this.desCancBTN.Enabled = false;
        	llenaTablaDisponibilidad();
        }
        
        void llenaTablaDisponibilidad(){
        	BLProductoTienda blProdTi = new BLProductoTienda();
        	int tiendaActual = this.pedido.Tienda.Id;
        	this.index = this.listProdPedTBL.CurrentRow.Index;
        	int codP = Int32.Parse(this.listProdPedTBL.Rows[this.index].Cells[0].Value.ToString());
        	this.codLinea = this.pedido.Detalle[this.index].CodLinea;
        	try{
        		this.prodTienda = blProdTi.getTiendaPorProducto(codP);    		
        		this.dispTBL.Rows.Clear();
	        	foreach (BEProductoTienda t in this.prodTienda) {
        			//Para que no considere la tienda que hizo el pedido, solo las demás
        			if(tiendaActual!=t.Tienda)
	        			this.dispTBL.Rows.Add(false, t.Tienda, t.NombreTienda, t.StockActual, 0);
	        	}
        		this.lblTiendCant.Text = "" + this.prodTienda.Count;
        	}
        	catch{
        		Utils.MessageError("Hubo un error y no se puedo obtener la disponibilidad del producto.",null);
        	}
        }
        
        void Button1Click(object sender, EventArgs e)
        {
        	llenaTablaDisponibilidad();       	
        }
        
        void ProdLimpBTNClick(object sender, EventArgs e)
        {
        	this.dispTBL.Rows.Clear();
        	this.eliCBCOL.Checked = false;
        }
        
        void DespAcepBTNClick(object sender, EventArgs e)
        {
        	int i = 0, cant, cantEnv, est=3, estPed=3, res=0, cantAEnviar;
        	//est = 1 (parcialmente atendido), 2(completamente atendido), 3(solicitado)
        	BLLineaPedidoAbastecimiento blLinea = new BLLineaPedidoAbastecimiento();
        	List<BELineaPedidoAbastecimiento> detallePed = this.pedido.Detalle;
        	BLProducto blProd = new BLProducto();
        	estPed = 3;
        	foreach (DataGridViewRow fila in this.listProdPedTBL.Rows) {
        		BEProveedor prov = blProd.getProveedorByRSocial(fila.Cells[2].Value.ToString());
        		cant = Int32.Parse(fila.Cells[3].Value.ToString());
        		cantEnv = Int32.Parse(fila.Cells[4].Value.ToString());
        		cantAEnviar = Int32.Parse(fila.Cells[5].Value.ToString());
        		//Si cantRec es igual a 0 entonces no se ha despachado nada, por lo tanto el pedido sigue
        		//en estado solicitado
        		if((cantAEnviar!=0)&&((cantAEnviar + cantEnv)-cant)<0){
        			est = 1;
        			if(estPed==3){//Parcialmente Atendido
        				estPed = 1;
        			}
        		}
        		if((cantAEnviar!=0)&&(((cant-cantEnv)==0)||(((cantAEnviar + cantEnv)-cant)>0))){
        			est = 2;
        			if((estPed==3)||(estPed==1)){
        				estPed = 2;
        			}
        		}
        		//MessageBox.Show("CodPed: " + this.pedido.Codigo + " CodLinea: " + detallePed[i].CodLinea + " " +
        		//                "IdProv: " + prov.IdProv + " Cant: " + cant + " CantRec: " + cant);
        		res = blLinea.modificaLineaPedido(this.pedido.Codigo, detallePed[i].CodLinea, prov.IdProv,cant, 0, (cantAEnviar + cantEnv),est);
        		est = 3;
        		if(res==0){
        			Utils.MessageError("Se presento un problema y no se pudo despachar el pedido.",null);
        			break;
        		}
        		i++;
        	}        	
        	
        	if(res!=0){
	        	BLPedidoAbastecimiento blPedido = new BLPedidoAbastecimiento();
	        	int resEst = blPedido.actualizaEstadoPedido(this.pedido.Codigo, estPed);
	        	if(resEst==0){
	        		Utils.MessageError("Se presento un error.",null);
	        	}
	        	else{
	        		Utils.MessageInformation("Se despacho el pedido correctamente.");
	        	}
	        	this.Close();
        	}
        }
        
    }
}
